openapi: 3.0.3
info:
  title: Issue Tracker API
  version: 1.0.0
  description: API for an issue tracking system where users can manage projects, members,
    and issues.
paths:
  /api/v1/auth/login/:
    post:
      operationId: auth_login_create
      description: |-
        Check the credentials and return the REST Token
        if the credentials are valid and authenticated.
        Calls Django Auth login method to register User ID
        in Django session framework

        Accept the following POST parameters: username, password
        Return the REST Framework Token Object's key.
      tags:
        - auth
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Fixed.CustomLogin'
        required: true
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
        - {}
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Fixed.JWT'
          description: ''
  /api/v1/auth/logout/:
    post:
      operationId: auth_logout_create
      description: |-
        Calls Django logout method and delete the Token object
        assigned to the current User object.

        Accepts/Returns nothing.
      tags:
        - auth
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
        - {}
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Fixed.RestAuthDetail'
          description: ''
  /api/v1/auth/password/change/:
    post:
      operationId: auth_password_change_create
      description: |-
        Calls Django Auth SetPasswordForm save method.

        Accepts the following POST parameters: new_password1, new_password2
        Returns the success/fail message.
      tags:
        - auth
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Fixed.CustomPasswordChange'
        required: true
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Fixed.RestAuthDetail'
          description: ''
  /api/v1/auth/password/reset/:
    post:
      operationId: auth_password_reset_create
      description: |-
        Calls Django Auth PasswordResetForm save method.

        Accepts the following POST parameters: email
        Returns the success/fail message.
      tags:
        - auth
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CustomPasswordResetView.CustomPasswordReset'
        required: true
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
        - {}
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomPasswordResetView.CustomPasswordReset'
          description: ''
  /api/v1/auth/password/reset/confirm/:
    post:
      operationId: auth_password_reset_confirm_create
      description: |-
        Password reset e-mail link is confirmed, therefore
        this resets the user's password.

        Accepts the following POST parameters: token, uid,
            new_password1, new_password2
        Returns the success/fail message.
      tags:
        - auth
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Fixed.CustomPasswordResetConfirm'
        required: true
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
        - {}
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Fixed.RestAuthDetail'
          description: ''
  /api/v1/auth/registration/:
    post:
      operationId: auth_registration_create
      description: |-
        Registers a new user.

        Accepts the following POST parameters: username, email, password1, password2.
      tags:
        - auth
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CustomRegisterView.CustomRegister'
        required: true
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
        - {}
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomRegisterView.CustomRegister'
          description: ''
  /api/v1/auth/registration/resend-email/:
    post:
      operationId: auth_registration_resend_email_create
      description: |-
        Resends another email to an unverified email.

        Accepts the following POST parameter: email.
      tags:
        - auth
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CustomResendEmailVerificationView.ResendEmailVerification'
        required: true
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
        - {}
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CustomResendEmailVerificationView.ResendEmailVerification'
          description: ''
  /api/v1/auth/registration/verify-email/:
    post:
      operationId: auth_registration_verify_email_create
      description: |-
        Verifies the email associated with the provided key.

        Accepts the following POST parameter: key.
      tags:
        - auth
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Fixed.VerifyEmail'
        required: true
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
        - {}
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Fixed.RestAuthDetail'
          description: ''
  /api/v1/auth/token/refresh/:
    post:
      operationId: auth_token_refresh_create
      description: |-
        Takes a refresh type JSON web token and returns an access type JSON web
        token if the refresh token is valid.
      tags:
        - auth
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TokenRefresh'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TokenRefresh'
          description: ''
  /api/v1/auth/token/verify/:
    post:
      operationId: auth_token_verify_create
      description: |-
        Takes a token and indicates if it is valid.  This view provides no
        information about a token's fitness for a particular use.
      tags:
        - auth
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TokenVerifyView.TokenVerify'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TokenVerifyView.TokenVerify'
          description: ''
  /api/v1/auth/user/:
    get:
      operationId: auth_user_retrieve
      description: |-
        Reads and updates UserModel fields
        Accepts GET, PUT, PATCH methods.

        Default accepted fields: username, first_name, last_name
        Default display fields: pk, username, email, first_name, last_name
        Read-only fields: pk, email

        Returns UserModel fields.
      tags:
        - auth
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserDetailsView.UserDetails'
          description: ''
    put:
      operationId: auth_user_update
      description: |-
        Reads and updates UserModel fields
        Accepts GET, PUT, PATCH methods.

        Default accepted fields: username, first_name, last_name
        Default display fields: pk, username, email, first_name, last_name
        Read-only fields: pk, email

        Returns UserModel fields.
      tags:
        - auth
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UserDetailsView.UserDetails'
        required: true
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserDetailsView.UserDetails'
          description: ''
    patch:
      operationId: auth_user_partial_update
      description: |-
        Reads and updates UserModel fields
        Accepts GET, PUT, PATCH methods.

        Default accepted fields: username, first_name, last_name
        Default display fields: pk, username, email, first_name, last_name
        Read-only fields: pk, email

        Returns UserModel fields.
      tags:
        - auth
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchedUserDetailsView.UserDetails'
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserDetailsView.UserDetails'
          description: ''
  /api/v1/issues/{issue_id}/:
    get:
      operationId: issues_retrieve
      parameters:
        - in: path
          name: issue_id
          schema:
            type: integer
          required: true
      tags:
        - issues
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IssueDetailUpdateDeleteView.IssueDetail'
          description: ''
    put:
      operationId: issues_update
      parameters:
        - in: path
          name: issue_id
          schema:
            type: integer
          required: true
      tags:
        - issues
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/IssueDetailUpdateDeleteView.IssueUpdate'
        required: true
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IssueDetailUpdateDeleteView.IssueDetail'
          description: ''
    delete:
      operationId: issues_destroy
      parameters:
        - in: path
          name: issue_id
          schema:
            type: integer
          required: true
      tags:
        - issues
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '204':
          description: No response body
  /api/v1/issues/{issue_id}/assign/:
    put:
      operationId: issues_assign_update
      parameters:
        - in: path
          name: issue_id
          schema:
            type: integer
          required: true
      tags:
        - issues
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/IssueAssignView.IssueAssign'
        required: true
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IssueAssignView.IssueDetail'
          description: ''
  /api/v1/issues/{issue_id}/attachments/:
    get:
      operationId: issues_attachments_list
      description: |-
        Helper class that provides a standard way to create an ABC using
        inheritance.
      parameters:
        - in: query
          name: extension
          schema:
            type: string
            minLength: 1
        - in: path
          name: issue_id
          schema:
            type: integer
          required: true
        - name: limit
          required: false
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
        - name: offset
          required: false
          in: query
          description: The initial index from which to return the results.
          schema:
            type: integer
      tags:
        - issues
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedIssueAttachmentListCreateView.AttachmentListList'
          description: ''
    post:
      operationId: issues_attachments_create
      description: |-
        Helper class that provides a standard way to create an ABC using
        inheritance.
      parameters:
        - in: path
          name: issue_id
          schema:
            type: integer
          required: true
      tags:
        - issues
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IssueAttachmentListCreateView.AttachmentDetail'
          description: ''
  /api/v1/issues/{issue_id}/attachments/{attachment_id}:
    get:
      operationId: issues_attachments_retrieve
      parameters:
        - in: path
          name: attachment_id
          schema:
            type: integer
          required: true
        - in: path
          name: issue_id
          schema:
            type: integer
          required: true
      tags:
        - issues
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AttachmentDetailDeleteView.AttachmentDetail'
          description: ''
    delete:
      operationId: issues_attachments_destroy
      parameters:
        - in: path
          name: attachment_id
          schema:
            type: integer
          required: true
        - in: path
          name: issue_id
          schema:
            type: integer
          required: true
      tags:
        - issues
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '204':
          description: No response body
  /api/v1/issues/{issue_id}/comments/:
    get:
      operationId: issues_comments_list
      parameters:
        - in: query
          name: author
          schema:
            type: integer
        - in: path
          name: issue_id
          schema:
            type: integer
          required: true
        - name: limit
          required: false
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
        - name: offset
          required: false
          in: query
          description: The initial index from which to return the results.
          schema:
            type: integer
      tags:
        - issues
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedCommentListCreateView.CommentListList'
          description: ''
    post:
      operationId: issues_comments_create
      parameters:
        - in: path
          name: issue_id
          schema:
            type: integer
          required: true
      tags:
        - issues
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CommentListCreateView.CommentCreate'
        required: true
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommentListCreateView.CommentDetail'
          description: ''
  /api/v1/issues/{issue_id}/comments/{comment_id}:
    get:
      operationId: issues_comments_retrieve
      parameters:
        - in: path
          name: comment_id
          schema:
            type: integer
          required: true
        - in: path
          name: issue_id
          schema:
            type: integer
          required: true
      tags:
        - issues
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommentDetailUpdateDeleteView.CommentDetail'
          description: ''
    put:
      operationId: issues_comments_update
      parameters:
        - in: path
          name: comment_id
          schema:
            type: integer
          required: true
        - in: path
          name: issue_id
          schema:
            type: integer
          required: true
      tags:
        - issues
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CommentDetailUpdateDeleteView.CommentUpdate'
        required: true
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommentDetailUpdateDeleteView.CommentDetail'
          description: ''
    delete:
      operationId: issues_comments_destroy
      parameters:
        - in: path
          name: comment_id
          schema:
            type: integer
          required: true
        - in: path
          name: issue_id
          schema:
            type: integer
          required: true
      tags:
        - issues
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '204':
          description: No response body
  /api/v1/issues/{issue_id}/comments/{comment_id}/attachments/:
    get:
      operationId: issues_comments_attachments_list
      description: |-
        Helper class that provides a standard way to create an ABC using
        inheritance.
      parameters:
        - in: path
          name: comment_id
          schema:
            type: integer
          required: true
        - in: query
          name: extension
          schema:
            type: string
            minLength: 1
        - in: path
          name: issue_id
          schema:
            type: integer
          required: true
        - name: limit
          required: false
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
        - name: offset
          required: false
          in: query
          description: The initial index from which to return the results.
          schema:
            type: integer
      tags:
        - issues
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedCommentAttachmentListCreateView.AttachmentListList'
          description: ''
    post:
      operationId: issues_comments_attachments_create
      description: |-
        Helper class that provides a standard way to create an ABC using
        inheritance.
      parameters:
        - in: path
          name: comment_id
          schema:
            type: integer
          required: true
        - in: path
          name: issue_id
          schema:
            type: integer
          required: true
      tags:
        - issues
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CommentAttachmentListCreateView.AttachmentDetail'
          description: ''
  /api/v1/issues/{issue_id}/history/:
    get:
      operationId: issues_history_list
      parameters:
        - in: query
          name: action
          schema:
            enum:
              - 0
              - 1
              - 2
              - 3
            type: integer
          description: |-
            * `0` - create
            * `1` - update
            * `2` - delete
            * `3` - access
        - in: query
          name: actor
          schema:
            type: integer
        - in: query
          name: content_type
          schema:
            enum:
              - issue
              - comment
              - attachment
            type: string
            minLength: 1
          description: |-
            * `issue` - Issue
            * `comment` - Issue comment
            * `attachment` - Issue attachment
        - in: path
          name: issue_id
          schema:
            type: integer
          required: true
        - name: limit
          required: false
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
        - name: offset
          required: false
          in: query
          description: The initial index from which to return the results.
          schema:
            type: integer
        - in: query
          name: order_by
          schema:
            type: array
            items:
              enum:
                - timestamp
                - -timestamp
              type: string
              description: |-
                * `timestamp` - Timestamp
                * `-timestamp` - Timestamp (descending)
      tags:
        - issues
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedHistoryListView.HistoryEntryListList'
          description: ''
  /api/v1/projects/:
    get:
      operationId: projects_list
      parameters:
        - name: limit
          required: false
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
        - in: query
          name: name
          schema:
            type: string
            minLength: 1
          description: Case-insensitive substring filter.
        - name: offset
          required: false
          in: query
          description: The initial index from which to return the results.
          schema:
            type: integer
        - in: query
          name: order_by
          schema:
            type: array
            items:
              enum:
                - name
                - -name
                - status
                - -status
                - role
                - -role
              type: string
              description: |-
                * `name` - Name
                * `-name` - Name (descending)
                * `status` - Status
                * `-status` - Status (descending)
                * `role` - Role
                * `-role` - Role (descending)
        - in: query
          name: role
          schema:
            enum:
              - MNG
              - DEV
              - REP
            type: string
            minLength: 1
          description: |-
            * `MNG` - manager
            * `DEV` - developer
            * `REP` - reporter
        - in: query
          name: status
          schema:
            enum:
              - 1
              - 2
            type: integer
          description: |-
            * `1` - active
            * `2` - closed
      tags:
        - projects
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedProjectListCreateView.ProjectListList'
          description: ''
    post:
      operationId: projects_create
      tags:
        - projects
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProjectListCreateView.ProjectCreate'
        required: true
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectListCreateView.ProjectDetailWithoutRole'
          description: ''
  /api/v1/projects/{project_id}/:
    get:
      operationId: projects_retrieve
      parameters:
        - in: path
          name: project_id
          schema:
            type: integer
          required: true
      tags:
        - projects
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectDetailUpdateView.ProjectDetail'
          description: ''
    put:
      operationId: projects_update
      parameters:
        - in: path
          name: project_id
          schema:
            type: integer
          required: true
      tags:
        - projects
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProjectDetailUpdateView.ProjectUpdate'
        required: true
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectDetailUpdateView.ProjectDetailWithoutRole'
          description: ''
  /api/v1/projects/{project_id}/issues/:
    get:
      operationId: projects_issues_list
      parameters:
        - in: query
          name: assigned_to
          schema:
            type: integer
        - in: query
          name: created_by
          schema:
            type: integer
        - name: limit
          required: false
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
        - name: offset
          required: false
          in: query
          description: The initial index from which to return the results.
          schema:
            type: integer
        - in: query
          name: order_by
          schema:
            type: array
            items:
              enum:
                - title
                - -title
                - status
                - -status
                - priority
                - -priority
                - type
                - -type
                - created_at
                - -created_at
              type: string
              description: |-
                * `title` - Title
                * `-title` - Title (descending)
                * `status` - Status
                * `-status` - Status (descending)
                * `priority` - Priority
                * `-priority` - Priority (descending)
                * `type` - Type
                * `-type` - Type (descending)
                * `created_at` - Created at
                * `-created_at` - Created at (descending)
        - in: query
          name: priority
          schema:
            enum:
              - 1
              - 2
              - 3
              - 4
            type: integer
          description: |-
            * `1` - low
            * `2` - medium
            * `3` - high
            * `4` - critical
        - in: path
          name: project_id
          schema:
            type: integer
          required: true
        - in: query
          name: status
          schema:
            enum:
              - 1
              - 2
              - 3
            type: integer
          description: |-
            * `1` - open
            * `2` - in progress
            * `3` - closed
        - in: query
          name: title
          schema:
            type: string
            minLength: 1
          description: Case-insensitive substring filter.
        - in: query
          name: type
          schema:
            enum:
              - 1
              - 2
            type: integer
          description: |-
            * `1` - bug
            * `2` - feature
        - in: query
          name: unassigned
          schema:
            type: boolean
          description: Return only the issues that are not assigned to any user.
      tags:
        - projects
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedIssueListCreateView.IssueListList'
          description: ''
    post:
      operationId: projects_issues_create
      parameters:
        - in: path
          name: project_id
          schema:
            type: integer
          required: true
      tags:
        - projects
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/IssueListCreateView.IssueCreate'
        required: true
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IssueListCreateView.IssueDetail'
          description: ''
  /api/v1/projects/{project_id}/members/:
    get:
      operationId: projects_members_list
      parameters:
        - in: query
          name: email
          schema:
            type: string
            minLength: 1
          description: Case-insensitive substring filter.
        - in: query
          name: first_name
          schema:
            type: string
            minLength: 1
          description: Case-insensitive substring filter.
        - in: query
          name: last_name
          schema:
            type: string
            minLength: 1
          description: Case-insensitive substring filter.
        - name: limit
          required: false
          in: query
          description: Number of results to return per page.
          schema:
            type: integer
        - name: offset
          required: false
          in: query
          description: The initial index from which to return the results.
          schema:
            type: integer
        - in: query
          name: order_by
          schema:
            type: array
            items:
              enum:
                - first_name
                - -first_name
                - last_name
                - -last_name
                - email
                - -email
                - role
                - -role
              type: string
              description: |-
                * `first_name` - First name
                * `-first_name` - First name (descending)
                * `last_name` - Last name
                * `-last_name` - Last name (descending)
                * `email` - Email
                * `-email` - Email (descending)
                * `role` - Role
                * `-role` - Role (descending)
        - in: path
          name: project_id
          schema:
            type: integer
          required: true
        - in: query
          name: role
          schema:
            enum:
              - MNG
              - DEV
              - REP
            type: string
            minLength: 1
          description: |-
            * `MNG` - manager
            * `DEV` - developer
            * `REP` - reporter
      tags:
        - projects
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedMemberListCreateView.MemberDetailList'
          description: ''
    post:
      operationId: projects_members_create
      parameters:
        - in: path
          name: project_id
          schema:
            type: integer
          required: true
      tags:
        - projects
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MemberListCreateView.MemberCreate'
        required: true
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemberListCreateView.MemberDetail'
          description: ''
  /api/v1/projects/{project_id}/members/{member_id}/:
    get:
      operationId: projects_members_retrieve
      parameters:
        - in: path
          name: member_id
          schema:
            type: integer
          required: true
        - in: path
          name: project_id
          schema:
            type: integer
          required: true
      tags:
        - projects
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemberDetailUpdateDeleteView.MemberDetail'
          description: ''
    put:
      operationId: projects_members_update
      parameters:
        - in: path
          name: member_id
          schema:
            type: integer
          required: true
        - in: path
          name: project_id
          schema:
            type: integer
          required: true
      tags:
        - projects
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/MemberDetailUpdateDeleteView.MemberUpdate'
        required: true
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemberDetailUpdateDeleteView.MemberDetail'
          description: ''
    delete:
      operationId: projects_members_destroy
      parameters:
        - in: path
          name: member_id
          schema:
            type: integer
          required: true
        - in: path
          name: project_id
          schema:
            type: integer
          required: true
      tags:
        - projects
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '204':
          description: No response body
  /api/v1/projects/current/:
    get:
      operationId: projects_current_retrieve
      parameters:
        - in: header
          name: X-Project-Identifier
          schema:
            type: string
      tags:
        - projects
      security:
        - jwtHeaderAuth: []
        - jwtCookieAuth: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProjectCurrentDetailView.ProjectDetail'
          description: ''
components:
  schemas:
    ActionEnum:
      enum:
        - 0
        - 1
        - 2
        - 3
      type: integer
      description: |-
        * `0` - create
        * `1` - update
        * `2` - delete
        * `3` - access
    AttachmentDetailDeleteView.AttachmentDetail:
      type: object
      properties:
        id:
          type: integer
        url:
          type: string
        created_at:
          type: string
          format: date-time
      required:
        - created_at
        - id
        - url
    CommentAttachmentListCreateView.AttachmentDetail:
      type: object
      properties:
        id:
          type: integer
        url:
          type: string
        created_at:
          type: string
          format: date-time
      required:
        - created_at
        - id
        - url
    CommentAttachmentListCreateView.AttachmentList:
      type: object
      properties:
        id:
          type: integer
        url:
          type: string
        created_at:
          type: string
          format: date-time
      required:
        - created_at
        - id
        - url
    CommentDetailUpdateDeleteView.CommentDetail:
      type: object
      properties:
        id:
          type: integer
        author:
          $ref: '#/components/schemas/CommentDetailUpdateDeleteView.IssueParticipant'
        text:
          type: string
        created_at:
          type: string
          format: date-time
      required:
        - author
        - created_at
        - id
        - text
    CommentDetailUpdateDeleteView.CommentUpdate:
      type: object
      properties:
        text:
          type: string
      required:
        - text
    CommentDetailUpdateDeleteView.IssueParticipant:
      type: object
      properties:
        id:
          type: integer
        email:
          type: string
        first_name:
          type: string
        last_name:
          type: string
      required:
        - email
        - first_name
        - id
        - last_name
    CommentListCreateView.CommentCreate:
      type: object
      properties:
        text:
          type: string
      required:
        - text
    CommentListCreateView.CommentDetail:
      type: object
      properties:
        id:
          type: integer
        author:
          $ref: '#/components/schemas/CommentListCreateView.IssueParticipant'
        text:
          type: string
        created_at:
          type: string
          format: date-time
      required:
        - author
        - created_at
        - id
        - text
    CommentListCreateView.CommentList:
      type: object
      properties:
        id:
          type: integer
        author:
          $ref: '#/components/schemas/CommentListCreateView.IssueParticipant'
        text:
          type: string
        created_at:
          type: string
          format: date-time
      required:
        - author
        - created_at
        - id
        - text
    CommentListCreateView.IssueParticipant:
      type: object
      properties:
        id:
          type: integer
        email:
          type: string
        first_name:
          type: string
        last_name:
          type: string
      required:
        - email
        - first_name
        - id
        - last_name
    CustomPasswordResetView.CustomPasswordReset:
      type: object
      description: Serializer for requesting a password reset e-mail.
      properties:
        email:
          type: string
          format: email
      required:
        - email
    CustomRegisterView.CustomRegister:
      type: object
      properties:
        username:
          type: string
          maxLength: 150
          minLength: 5
        email:
          type: string
          format: email
        password:
          type: string
          writeOnly: true
        first_name:
          type: string
          maxLength: 150
        last_name:
          type: string
          maxLength: 150
      required:
        - email
        - first_name
        - last_name
        - password
        - username
    CustomResendEmailVerificationView.ResendEmailVerification:
      type: object
      properties:
        email:
          type: string
          format: email
      required:
        - email
    Fixed.CustomLogin:
      type: object
      properties:
        username:
          type: string
        password:
          type: string
      required:
        - password
    Fixed.CustomPasswordChange:
      type: object
      properties:
        old_password:
          type: string
          maxLength: 128
        new_password:
          type: string
          writeOnly: true
      required:
        - new_password
        - old_password
    Fixed.CustomPasswordResetConfirm:
      type: object
      description: Serializer for confirming a password reset attempt.
      properties:
        uid:
          type: string
        token:
          type: string
        new_password:
          type: string
          writeOnly: true
      required:
        - new_password
        - token
        - uid
    Fixed.JWT:
      type: object
      description: Serializer for JWT authentication.
      properties:
        access:
          type: string
        refresh:
          type: string
        user:
          $ref: '#/components/schemas/Fixed.UserDetails'
      required:
        - access
        - refresh
        - user
    Fixed.RestAuthDetail:
      type: object
      properties:
        detail:
          type: string
          readOnly: true
      required:
        - detail
    Fixed.UserDetails:
      type: object
      description: User model w/o password
      properties:
        pk:
          type: integer
          readOnly: true
          title: ID
        username:
          type: string
          description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
            only.
          pattern: ^[\w.@+-]+$
          maxLength: 150
        email:
          type: string
          format: email
          readOnly: true
          title: Email address
        first_name:
          type: string
          maxLength: 150
        last_name:
          type: string
          maxLength: 150
      required:
        - email
        - pk
        - username
    Fixed.VerifyEmail:
      type: object
      properties:
        key:
          type: string
          writeOnly: true
      required:
        - key
    HistoryListView.HistoryEntryList:
      type: object
      properties:
        action:
          $ref: '#/components/schemas/ActionEnum'
        timestamp:
          type: string
          format: date-time
        content_type:
          type: string
        changes: {}
        actor:
          $ref: '#/components/schemas/HistoryListView.IssueParticipant'
      required:
        - action
        - actor
        - changes
        - content_type
        - timestamp
    HistoryListView.IssueParticipant:
      type: object
      properties:
        id:
          type: integer
        email:
          type: string
        first_name:
          type: string
        last_name:
          type: string
      required:
        - email
        - first_name
        - id
        - last_name
    IssueAssignView.IssueAssign:
      type: object
      properties:
        assigned_to_id:
          type: integer
          nullable: true
      required:
        - assigned_to_id
    IssueAssignView.IssueDetail:
      type: object
      properties:
        id:
          type: integer
        project_id:
          type: integer
        title:
          type: string
        description:
          type: string
        status:
          $ref: '#/components/schemas/Status9b7Enum'
        priority:
          $ref: '#/components/schemas/PriorityEnum'
        type:
          $ref: '#/components/schemas/TypeEnum'
        created_by:
          $ref: '#/components/schemas/IssueAssignView.IssueParticipant'
        assigned_to:
          $ref: '#/components/schemas/IssueAssignView.IssueParticipant'
        created_at:
          type: string
          format: date-time
      required:
        - assigned_to
        - created_at
        - created_by
        - description
        - id
        - priority
        - project_id
        - status
        - title
        - type
    IssueAssignView.IssueParticipant:
      type: object
      properties:
        id:
          type: integer
        email:
          type: string
        first_name:
          type: string
        last_name:
          type: string
      required:
        - email
        - first_name
        - id
        - last_name
    IssueAttachmentListCreateView.AttachmentDetail:
      type: object
      properties:
        id:
          type: integer
        url:
          type: string
        created_at:
          type: string
          format: date-time
      required:
        - created_at
        - id
        - url
    IssueAttachmentListCreateView.AttachmentList:
      type: object
      properties:
        id:
          type: integer
        url:
          type: string
        created_at:
          type: string
          format: date-time
      required:
        - created_at
        - id
        - url
    IssueDetailUpdateDeleteView.IssueDetail:
      type: object
      properties:
        id:
          type: integer
        project_id:
          type: integer
        title:
          type: string
        description:
          type: string
        status:
          $ref: '#/components/schemas/Status9b7Enum'
        priority:
          $ref: '#/components/schemas/PriorityEnum'
        type:
          $ref: '#/components/schemas/TypeEnum'
        created_by:
          $ref: '#/components/schemas/IssueDetailUpdateDeleteView.IssueParticipant'
        assigned_to:
          $ref: '#/components/schemas/IssueDetailUpdateDeleteView.IssueParticipant'
        created_at:
          type: string
          format: date-time
      required:
        - assigned_to
        - created_at
        - created_by
        - description
        - id
        - priority
        - project_id
        - status
        - title
        - type
    IssueDetailUpdateDeleteView.IssueParticipant:
      type: object
      properties:
        id:
          type: integer
        email:
          type: string
        first_name:
          type: string
        last_name:
          type: string
      required:
        - email
        - first_name
        - id
        - last_name
    IssueDetailUpdateDeleteView.IssueUpdate:
      type: object
      properties:
        title:
          type: string
        description:
          type: string
        status:
          $ref: '#/components/schemas/Status9b7Enum'
        priority:
          $ref: '#/components/schemas/PriorityEnum'
        issue_type:
          $ref: '#/components/schemas/IssueTypeEnum'
      required:
        - description
        - issue_type
        - priority
        - status
        - title
    IssueListCreateView.IssueCreate:
      type: object
      properties:
        title:
          type: string
        description:
          type: string
        priority:
          $ref: '#/components/schemas/PriorityEnum'
        issue_type:
          $ref: '#/components/schemas/IssueTypeEnum'
        assigned_to_id:
          type: integer
          nullable: true
      required:
        - assigned_to_id
        - description
        - issue_type
        - priority
        - title
    IssueListCreateView.IssueDetail:
      type: object
      properties:
        id:
          type: integer
        project_id:
          type: integer
        title:
          type: string
        description:
          type: string
        status:
          $ref: '#/components/schemas/Status9b7Enum'
        priority:
          $ref: '#/components/schemas/PriorityEnum'
        type:
          $ref: '#/components/schemas/TypeEnum'
        created_by:
          $ref: '#/components/schemas/IssueListCreateView.IssueParticipant'
        assigned_to:
          $ref: '#/components/schemas/IssueListCreateView.IssueParticipant'
        created_at:
          type: string
          format: date-time
      required:
        - assigned_to
        - created_at
        - created_by
        - description
        - id
        - priority
        - project_id
        - status
        - title
        - type
    IssueListCreateView.IssueList:
      type: object
      properties:
        id:
          type: integer
        title:
          type: string
        status:
          $ref: '#/components/schemas/Status9b7Enum'
        priority:
          $ref: '#/components/schemas/PriorityEnum'
        type:
          $ref: '#/components/schemas/TypeEnum'
        created_by:
          $ref: '#/components/schemas/IssueListCreateView.IssueParticipant'
        assigned_to:
          $ref: '#/components/schemas/IssueListCreateView.IssueParticipant'
        created_at:
          type: string
          format: date-time
      required:
        - assigned_to
        - created_at
        - created_by
        - id
        - priority
        - status
        - title
        - type
    IssueListCreateView.IssueParticipant:
      type: object
      properties:
        id:
          type: integer
        email:
          type: string
        first_name:
          type: string
        last_name:
          type: string
      required:
        - email
        - first_name
        - id
        - last_name
    IssueTypeEnum:
      enum:
        - 1
        - 2
      type: integer
      description: |-
        * `1` - bug
        * `2` - feature
    MemberDetailUpdateDeleteView.MemberDetail:
      type: object
      properties:
        user_id:
          type: integer
        first_name:
          type: string
        last_name:
          type: string
        email:
          type: string
        role:
          $ref: '#/components/schemas/RoleEnum'
      required:
        - email
        - first_name
        - last_name
        - role
        - user_id
    MemberDetailUpdateDeleteView.MemberUpdate:
      type: object
      properties:
        new_role:
          $ref: '#/components/schemas/NewRoleEnum'
      required:
        - new_role
    MemberListCreateView.MemberCreate:
      type: object
      properties:
        email:
          type: string
          format: email
        role:
          $ref: '#/components/schemas/RoleEnum'
      required:
        - email
        - role
    MemberListCreateView.MemberDetail:
      type: object
      properties:
        user_id:
          type: integer
        first_name:
          type: string
        last_name:
          type: string
        email:
          type: string
        role:
          $ref: '#/components/schemas/RoleEnum'
      required:
        - email
        - first_name
        - last_name
        - role
        - user_id
    NewRoleEnum:
      enum:
        - MNG
        - DEV
        - REP
      type: string
      description: |-
        * `MNG` - manager
        * `DEV` - developer
        * `REP` - reporter
    PaginatedCommentAttachmentListCreateView.AttachmentListList:
      type: object
      required:
        - count
        - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?offset=400&limit=100
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?offset=200&limit=100
        results:
          type: array
          items:
            $ref: '#/components/schemas/CommentAttachmentListCreateView.AttachmentList'
    PaginatedCommentListCreateView.CommentListList:
      type: object
      required:
        - count
        - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?offset=400&limit=100
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?offset=200&limit=100
        results:
          type: array
          items:
            $ref: '#/components/schemas/CommentListCreateView.CommentList'
    PaginatedHistoryListView.HistoryEntryListList:
      type: object
      required:
        - count
        - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?offset=400&limit=100
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?offset=200&limit=100
        results:
          type: array
          items:
            $ref: '#/components/schemas/HistoryListView.HistoryEntryList'
    PaginatedIssueAttachmentListCreateView.AttachmentListList:
      type: object
      required:
        - count
        - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?offset=400&limit=100
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?offset=200&limit=100
        results:
          type: array
          items:
            $ref: '#/components/schemas/IssueAttachmentListCreateView.AttachmentList'
    PaginatedIssueListCreateView.IssueListList:
      type: object
      required:
        - count
        - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?offset=400&limit=100
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?offset=200&limit=100
        results:
          type: array
          items:
            $ref: '#/components/schemas/IssueListCreateView.IssueList'
    PaginatedMemberListCreateView.MemberDetailList:
      type: object
      required:
        - count
        - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?offset=400&limit=100
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?offset=200&limit=100
        results:
          type: array
          items:
            $ref: '#/components/schemas/MemberListCreateView.MemberDetail'
    PaginatedProjectListCreateView.ProjectListList:
      type: object
      required:
        - count
        - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?offset=400&limit=100
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?offset=200&limit=100
        results:
          type: array
          items:
            $ref: '#/components/schemas/ProjectListCreateView.ProjectList'
    PatchedUserDetailsView.UserDetails:
      type: object
      description: User model w/o password
      properties:
        pk:
          type: integer
          readOnly: true
          title: ID
        username:
          type: string
          description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
            only.
          pattern: ^[\w.@+-]+$
          maxLength: 150
        email:
          type: string
          format: email
          readOnly: true
          title: Email address
        first_name:
          type: string
          maxLength: 150
        last_name:
          type: string
          maxLength: 150
    PriorityEnum:
      enum:
        - 1
        - 2
        - 3
        - 4
      type: integer
      description: |-
        * `1` - low
        * `2` - medium
        * `3` - high
        * `4` - critical
    ProjectCurrentDetailView.ProjectDetail:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        description:
          type: string
        url:
          type: string
          format: uri
        role:
          $ref: '#/components/schemas/RoleEnum'
        status:
          $ref: '#/components/schemas/Status85dEnum'
      required:
        - description
        - id
        - name
        - role
        - status
        - url
    ProjectDetailUpdateView.ProjectDetail:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        description:
          type: string
        url:
          type: string
          format: uri
        role:
          $ref: '#/components/schemas/RoleEnum'
        status:
          $ref: '#/components/schemas/Status85dEnum'
      required:
        - description
        - id
        - name
        - role
        - status
        - url
    ProjectDetailUpdateView.ProjectDetailWithoutRole:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        description:
          type: string
        url:
          type: string
          format: uri
        status:
          $ref: '#/components/schemas/Status85dEnum'
      required:
        - description
        - id
        - name
        - status
        - url
    ProjectDetailUpdateView.ProjectUpdate:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
        subdomain:
          type: string
        status:
          $ref: '#/components/schemas/Status85dEnum'
      required:
        - description
        - name
        - status
        - subdomain
    ProjectListCreateView.ProjectCreate:
      type: object
      properties:
        name:
          type: string
        description:
          type: string
        subdomain:
          type: string
      required:
        - description
        - name
        - subdomain
    ProjectListCreateView.ProjectDetailWithoutRole:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        description:
          type: string
        url:
          type: string
          format: uri
        status:
          $ref: '#/components/schemas/Status85dEnum'
      required:
        - description
        - id
        - name
        - status
        - url
    ProjectListCreateView.ProjectList:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        url:
          type: string
          format: uri
        role:
          $ref: '#/components/schemas/RoleEnum'
        status:
          $ref: '#/components/schemas/Status85dEnum'
      required:
        - id
        - name
        - role
        - status
        - url
    RoleEnum:
      enum:
        - MNG
        - DEV
        - REP
      type: string
      description: |-
        * `MNG` - manager
        * `DEV` - developer
        * `REP` - reporter
    Status85dEnum:
      enum:
        - 1
        - 2
      type: integer
      description: |-
        * `1` - active
        * `2` - closed
    Status9b7Enum:
      enum:
        - 1
        - 2
        - 3
      type: integer
      description: |-
        * `1` - open
        * `2` - in progress
        * `3` - closed
    TokenRefresh:
      type: object
      properties:
        access:
          type: string
          readOnly: true
        refresh:
          type: string
      required:
        - access
        - refresh
    TokenVerifyView.TokenVerify:
      type: object
      properties:
        token:
          type: string
          writeOnly: true
      required:
        - token
    TypeEnum:
      enum:
        - 1
        - 2
      type: integer
      description: |-
        * `1` - bug
        * `2` - feature
    UserDetailsView.UserDetails:
      type: object
      description: User model w/o password
      properties:
        pk:
          type: integer
          readOnly: true
          title: ID
        username:
          type: string
          description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_
            only.
          pattern: ^[\w.@+-]+$
          maxLength: 150
        email:
          type: string
          format: email
          readOnly: true
          title: Email address
        first_name:
          type: string
          maxLength: 150
        last_name:
          type: string
          maxLength: 150
      required:
        - email
        - pk
        - username
  securitySchemes:
    jwtCookieAuth:
      type: apiKey
      in: cookie
      name: bt-auth
    jwtHeaderAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
